package com.example.charges.dati.domain.dao;

import java.sql.Connection;
import java.util.Iterator;
import java.util.Observable;
import java.util.Set;
import java.util.Vector;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.example.charges.ControllerCharge;
import com.example.charges.dati.domain.CatSpese;
import com.example.charges.dati.domain.Gruppi;
import com.example.charges.dati.domain.IGruppi;
import com.molinari.androidstructure.data.db.IDao;
import com.molinari.androidstructure.data.db.IOggettoEntita;
import com.molinari.jdbcandroid.wrap.ConnectionAndroid;

public class WrapGruppi extends Observable implements IDao, IGruppi {

	private final Gruppi gruppo;
	private final Context context;
	
	public WrapGruppi(Context context) {
		gruppo = new Gruppi();
		this.context = context;
	}

	public WrapGruppi(final Gruppi gruppo, Context context) {
		this.gruppo = gruppo;
		this.context = context;
	}

	@Override
	public Object selectById(final int id) {
		final Connection cn = ControllerCharge.getConnection(context);

		ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
		String[] idGruppoString = new String[] { Integer.toString(id) };
		String orderBy = Gruppi.NOME + " desc";

		final Cursor cursor = cnAndroid.getDb().query(Gruppi.NOME_TABELLA, null, Gruppi.ID + " = ?", idGruppoString, null, null, orderBy);

		Gruppi gruppo = null;

		while (cursor.moveToNext()) {
			gruppo = new Gruppi();
			setGruppoFromCursor(cursor, gruppo);
		}

		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return gruppo;

	}

	private void setGruppoFromCursor(final Cursor cursor, final Gruppi gruppo) {
		gruppo.setidGruppo(cursor.getInt(0));
		gruppo.setnome(cursor.getString(1));
		gruppo.setdescrizione(cursor.getString(2));
	}

	@Override
	public Iterator<Object> selectWhere(final String where) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Iterator<Object> selectAll() {
		final Vector<Object> gruppi = new Vector<Object>();
		final Connection cn = ControllerCharge.getConnection(context);

		ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;

		String orderBy = Gruppi.NOME + " desc";
		Cursor cursor = cnAndroid.getDb().query(Gruppi.NOME_TABELLA, null, null, null, null, null, orderBy);

		while (cursor.moveToNext()) {
			final Gruppi gruppo = new Gruppi();
			setGruppoFromCursor(cursor, gruppo);
			gruppi.add(gruppo);
		}
		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return gruppi != null ? gruppi.iterator() : null;

	}

	@Override
	public boolean insert(final Object oggettoEntita) {
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) ControllerCharge.getConnection(context);;

		final Gruppi gruppo = (Gruppi) oggettoEntita;

		ContentValues values = new ContentValues();
		values.put(Gruppi.NOME, gruppo.getNomeEntita());
		values.put(Gruppi.DESCRIZIONE, gruppo.getdescrizione());

		if (cnAndroid.getDb().insert(Gruppi.NOME_TABELLA, null, values) == -1) {
			return false;
		}
		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return true;
	}

	@Override
	public boolean delete(final int id) {
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) ControllerCharge.getConnection(context);;
		String[] idGruppo = new String[] { Integer.toString(id) };

		if (cnAndroid.getDb().delete(Gruppi.NOME_TABELLA, Gruppi.ID + " = ?", idGruppo) == -1) {
			return false;
		}
		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return true;
	}

	@Override
	public boolean update(final Object oggettoEntita) {
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) ControllerCharge.getConnection(context);;

		final Gruppi gruppo = (Gruppi) oggettoEntita;

		String[] idGruppoString = new String[] { Integer.toString(gruppo.getidGruppo()) };

		ContentValues values = new ContentValues();
		values.put(Gruppi.NOME, gruppo.getNomeEntita());
		values.put(Gruppi.DESCRIZIONE, gruppo.getdescrizione());

		if (cnAndroid.getDb().update(Gruppi.NOME_TABELLA, values, Gruppi.ID + " = ?", idGruppoString) == -1) {
			return false;
		}
		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return true;
	}

	@Override
	public boolean deleteAll() {
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) ControllerCharge.getConnection(context);;
		final SQLiteDatabase db = cnAndroid.getDb();

		if (db.delete(Gruppi.NOME_TABELLA, "1", null) == -1) {
			return false;
		}

		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return true;

	}

	public Gruppi selectByNome(final String nome) {

		final ConnectionAndroid cnAndroid = (ConnectionAndroid) ControllerCharge.getConnection(context);;
		final SQLiteDatabase db = cnAndroid.getDb();
		final String[] selectionArgs = new String[] { nome };

		Cursor cursor = db.query(Gruppi.NOME_TABELLA, null, Gruppi.NOME + " = ?", selectionArgs, null, null, null);

		Gruppi gruppo = null;

		while (cursor.moveToNext()) {
			gruppo = new Gruppi();
			setGruppoFromCursor(cursor, gruppo);
		}
		try {
			ControllerCharge.getSingleton().getConnectionPool(context).chiudiOggettiDb(cnAndroid);
		} catch (SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		} catch (java.sql.SQLException e) {
			Log.e(WrapGruppi.class.getName(), Log.getStackTraceString(e));
		}

		return gruppo;

	}

	@Override
	public IOggettoEntita getEntitaPadre() {
		return gruppo;
	}

	@Override
	public String getdescrizione() {
		return gruppo.getdescrizione();
	}

	@Override
	public void setdescrizione(final String descrizione) {
		gruppo.setdescrizione(descrizione);
	}

	@Override
	public int getidGruppo() {
		return gruppo.getidGruppo();
	}

	@Override
	public void setidGruppo(final int idGruppo) {
		gruppo.setidGruppo(idGruppo);
	}

	@Override
	public String getNomeEntita() {
		return gruppo.getNomeEntita();
	}

	@Override
	public void setnome(final String nome) {
		gruppo.setnome(nome);
	}

	@Override
	public Set<CatSpese> getCatSpeses() {
		return gruppo.getCatSpeses();
	}

	@Override
	public void setCatSpeses(final Set<CatSpese> catSpeses) {
		gruppo.setCatSpeses(catSpeses);
	}

	@Override
	public void notifyObservers() {
		super.notifyObservers();
	}

	@Override
	public synchronized void setChanged() {
		super.setChanged();
	}

	@Override
	public IOggettoEntita getEntita() {
		return getEntitaPadre();
	}

}